/**
 *@author Victor Roncalla
 */

package pe.com.chilis.delivery.dao.implementacion;

import java.util.ArrayList;
import pe.com.chilis.delivery.dao.interfaz.ZonaRepartoDAO;
import pe.com.chilis.delivery.beans.Departamento;
import pe.com.chilis.delivery.beans.Distrito;
import pe.com.chilis.delivery.beans.Provincia;
import pe.com.chilis.delivery.beans.ZonaReparto;
import pe.com.chilis.delivery.excepcion.ExcepcionDatos;
import pe.com.chilis.delivery.log.UtilLog;

import com.ibatis.dao.client.DaoManager;
import com.ibatis.dao.client.template.SqlMapDaoTemplate;

public class SQLServerZonaRepartoDAO extends SqlMapDaoTemplate implements ZonaRepartoDAO {

	public SQLServerZonaRepartoDAO(DaoManager daoManager) {
		super(daoManager);
	}

	@Override
	public int registrarZonaReparto(ZonaReparto zonaReparto) throws ExcepcionDatos {
		try {
			daoManager.startTransaction();
			getSqlMapExecutor().insert("registrarZonaReparto", zonaReparto);
			
			for(Distrito distritoAsociado : zonaReparto.getDistritos()){
				distritoAsociado.setIdZonaReparto(zonaReparto.getIdZonaReparto());
				actualizarDistritoZonaReparto(distritoAsociado);
			}

			daoManager.commitTransaction();
		} catch (Exception excepcion) {
			UtilLog.imprimirExcepcion(excepcion);
			throw new ExcepcionDatos(excepcion.getMessage());
		}finally{
			daoManager.endTransaction();
		}

		return zonaReparto.getIdZonaReparto();
	}

	@Override
	public void actualizarZonaReparto(ZonaReparto zonaReparto) throws ExcepcionDatos {
		try {
			daoManager.startTransaction();
			getSqlMapExecutor().update("actualizarZonaReparto", zonaReparto);
			getSqlMapExecutor().update("actualizarDistritosZonaReparto", zonaReparto);
			
			for(Distrito distritoAsociado : zonaReparto.getDistritos()){
				actualizarDistritoZonaReparto(distritoAsociado);
			}
				
			daoManager.commitTransaction();
		} catch (Exception excepcion) {
			UtilLog.imprimirExcepcion(excepcion);
			throw new ExcepcionDatos(excepcion.getMessage());
		} finally{
			daoManager.endTransaction();
		}
	}

	@Override
	public void eliminarZonaReparto(ZonaReparto zonaReparto) throws ExcepcionDatos {
		try {
			getSqlMapExecutor().update("actualizarDistritosZonaReparto", zonaReparto);
			getSqlMapExecutor().delete("eliminarZonaReparto", zonaReparto.getIdZonaReparto());
		} catch (Exception excepcion) {
			UtilLog.imprimirExcepcion(excepcion);
			throw new ExcepcionDatos(excepcion.getMessage());
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public ArrayList<ZonaReparto> obtenerZonasReparto(ZonaReparto zonaReparto) throws ExcepcionDatos {
		ArrayList<ZonaReparto> zonasReparto = new ArrayList<ZonaReparto>();

		try {
			zonasReparto = (ArrayList<ZonaReparto>) queryForList("obtenerZonasReparto", zonaReparto);
		} catch (Exception excepcion) {
			UtilLog.imprimirExcepcion(excepcion);
			throw new ExcepcionDatos(excepcion.getMessage());
		}

		return zonasReparto;
	}

	@Override
	public ZonaReparto obtenerZonaRepartoPorId(int idZonaReparto) throws ExcepcionDatos {
		ZonaReparto zonaReparto = null;

		try {
			zonaReparto = (ZonaReparto) queryForObject("obtenerZonaRepartoPorId", idZonaReparto);
		} catch (Exception excepcion) {
			UtilLog.imprimirExcepcion(excepcion);
			throw new ExcepcionDatos(excepcion.getMessage());
		}

		return zonaReparto;
	}

	@Override
	public void actualizarDistritoZonaReparto(Distrito distrito) throws ExcepcionDatos {
		try {
			getSqlMapExecutor().update("actualizarDistritoZonaReparto", distrito);
		} catch (Exception excepcion) {
			UtilLog.imprimirExcepcion(excepcion);
			throw new ExcepcionDatos(excepcion.getMessage());
		}
	}

	@SuppressWarnings("unchecked")
	@Override
	public ArrayList<Departamento> listarDepartamentos() throws ExcepcionDatos {
		ArrayList<Departamento> departamentos = new ArrayList<Departamento>();
		try{
			departamentos = (ArrayList<Departamento>)queryForList("listarDepartamento", "");
		}catch (Exception excepcion) {
				UtilLog.imprimirExcepcion(excepcion);
				throw new ExcepcionDatos(excepcion.getMessage());
			}
		return departamentos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public ArrayList<Provincia> listarProvinciasPorDepartamento(Departamento departamento) throws ExcepcionDatos {
		ArrayList<Provincia> provincias = new ArrayList<Provincia>();
		try{
			provincias = (ArrayList<Provincia>)queryForList("listarProvinciaPorDepartamento", departamento);
		}catch (Exception excepcion) {
				UtilLog.imprimirExcepcion(excepcion);
				throw new ExcepcionDatos(excepcion.getMessage());
			}
		return provincias;
	}

	@SuppressWarnings("unchecked")
	@Override
	public ArrayList<Distrito> listarDistritosSinAsociarPorProvincia(Provincia provincia) throws ExcepcionDatos {
		ArrayList<Distrito> distritos = new ArrayList<Distrito>();
		try{
			distritos = (ArrayList<Distrito>)queryForList("listarDistritosSinAsociarPorProvincia", provincia);
		}catch (Exception excepcion) {
				UtilLog.imprimirExcepcion(excepcion);
				throw new ExcepcionDatos(excepcion.getMessage());
			}
		return distritos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public ArrayList<Distrito> listarDistritosAsociadosPorProvincia(Distrito distrito) throws ExcepcionDatos {
		ArrayList<Distrito> distritos = new ArrayList<Distrito>();

		try{
			distritos = (ArrayList<Distrito>)queryForList("listarDistritosAsociadosPorProvincia", distrito);
		}catch (Exception excepcion) {
			UtilLog.imprimirExcepcion(excepcion);
			throw new ExcepcionDatos(excepcion.getMessage());
		}

		return distritos;
	}

	@SuppressWarnings("unchecked")
	@Override
	public ArrayList<Distrito> listarDistritosAsociadosPorZonaReparto(ZonaReparto zonaReparto) throws ExcepcionDatos {
		ArrayList<Distrito> distritos = new ArrayList<Distrito>();

		try{
			distritos = (ArrayList<Distrito>)queryForList("listarDistritosAsociadosPorZonaReparto", zonaReparto);
		}catch (Exception excepcion) {
			UtilLog.imprimirExcepcion(excepcion);
			throw new ExcepcionDatos(excepcion.getMessage());
		}

		return distritos;
	}
}
